package com.bytezreo.innerclass;

/**
 * 
 * @Description  类的内部成员之五：内部类
 * @author Bytezero·zhenglei!        Email:420498246@qq.com
 * @version
 * @date 上午8:56:44
 * @   1.Java中允许将一个类A声明在另一个类B中，则类A就是内部类，类B成为外部类
 *      
 *     2.内部类的分类：成员内部类(静态，非静态) vs  局部内部类(方法内  代码块内  构造器内)
 *
 *	   3.成员内部类：
 *         一方面，作为外部类的成员：
 *             >调用外部类的结构
 *             >可以被 static 修饰
 *             >可以被 四种不同的权限修饰
 *         
 *         
 *         
 *         另一方面：作为一个类：
 *             >类内可以定义属性，方法，构造器等
 *			   >可以用final修饰，表示此类不能被继承，言外之意就是不适用final，可以被继承
 *			   >可以被abstract修饰，此类不能被实例化
 *
 *
 *		4.关注如下的 3  个 问题
 *          4.1 如何实例化成员内部类的对象
 *          
 *          4.2 如何在成员内部类中区分调用外部类的结构
 *          
 *          4.3 开发中局部内部类的使用   见 InnerClassTest2.java
 *
 *
 *
 */
public class InnerClassTest {
	public static void main(String[] args) {
		
		//创建内部类的 Dog 的实例化（静态成员内部类）：
		Person.Dog dog = new Person.Dog();
		dog.show();
		
		//创建内部类的 Bird 的实例化（非静态成员内部类）：
		//Person.Bird bird = new Person.Bird();   //不可以这样
		Person p =new Person();
		Person.Bird bird = p.new Bird();
		bird.sing();
		bird.display("鹦鹉");
		
	}
}

class  Person{
	
	String name = "外部类----小明";
	int age = 12;
	
	public void eat() {
		
		System.out.println("人吃饭");
	}
	
	
	
	//静态成员内部类
	 static class Dog{
		String name;
		int age;
		
		public void show() {
			System.out.println("忠犬八公");
			//eat();  //静态里不允许调用 非静态的方法   
			
		}
			
		
		
	}
	
	//非静态成员内部类
	 class Bird{
		String  name = "内部类----小小鸟";
		
		public Bird() {
			
		}
		public void sing() {
			
			System.out.println("我是一个小小鸟");
			//调用外部类的方法
			eat();  //省略了   Person.this.eat();
			Person.this.eat();
			
			System.out.println(age); //内部类的
			
			
			
		}
		
		public void display(String name) {
			
			System.out.println(name);       //方法的形参
			System.out.println(this.name);  //此类的属性--内部类属性
			System.out.println(Person.this.name);   //Person类的属性 --外部类的属性
			
		}
		
		
	}
	
	
	public void method() {
		
		//局部内部类
		class AA{
			
			
		}
		
	}
	
	//代码块内
	{
		
		//局部内部类
		class BB{
			
			
		}
	}
	

//构造器里面
public Person() {
	//局部内部类
	class CC{
		
		
	}
	
}



}



